package condominio;

import java.util.*;

@SuppressWarnings("deprecation")
public class Administrador {
	
	private ArrayList<Residente> residentes;
	private ArrayList<Vivienda> viviendas;
	private ArrayList<AreaComun> areasComunes;
	private ArrayList<Cuota> cuotas;
	private ArrayList<PagoCuota> pagoCuotas;
	private ArrayList<Vencida> vencidas;
	
	public Administrador(){
		residentes = new ArrayList<Residente>();
		viviendas = new ArrayList<Vivienda>();
		areasComunes = new ArrayList<AreaComun>();
		cuotas = new ArrayList<Cuota>();
		pagoCuotas = new ArrayList<PagoCuota>();
		vencidas = new ArrayList<Vencida>();
	}
	
	public ArrayList<Residente> getResidentes(){
		return residentes;
	}
	
	public ArrayList<Vivienda> getViviendas(){
		return viviendas;
	}
	
	public ArrayList<AreaComun> getAreasComunes(){
		return areasComunes;
	}
	
	public ArrayList<Cuota> getCuotas(){
		return cuotas;
	}
	
	public ArrayList<PagoCuota> getPagoCuotas(){
		return pagoCuotas;
	}
	
	public ArrayList<Vencida> getVencidas(){
		return vencidas;
	}
	
	public void setVencidas(ArrayList<Vencida> vencidas) {
		this.vencidas = vencidas;
	}
	
	public void registrarResidente(String dni, String nombre, String apellidoPaterno, String apellidoMaterno, String correo, String clave){
		buscarResidente(correo, dni);
		Residente residente = new Residente(dni, nombre, apellidoPaterno, apellidoMaterno, correo, clave);
		residentes.add(residente);
	}
	
	private void buscarResidente(String correo, String dni) throws RuntimeException{
		for (Residente residente : residentes){
			if(residente.getCorreo().equals(correo)){
				throw new RuntimeException("Correo ya se encuentra registrado");
			}
			if(residente.getDni().equals(dni)){
				throw new RuntimeException("Documento ya se encuentra registrado");
			}
		}
	}
	
	private Residente buscarResidente(String dni){
		for (Residente residente : residentes){
			if(residente.getDni().equals(dni)){
				return residente;
			}
		}
		return null;
	}
	
	public void eliminarResidente(String dni){
		residentes.remove(buscarResidente(dni));
	}
	
	public void registrarVivienda(String codigoVivienda, String ubicacion, int numero, double metraje, String tipo, String dni){
		buscarVivienda(ubicacion, numero);
		Vivienda vivienda = new Vivienda(codigoVivienda, ubicacion, numero, metraje, tipo, dni);
		viviendas.add(vivienda);
	}
	
	private void buscarVivienda(String ubicacion, int numero){
		for (Vivienda vivienda : viviendas){
			if (vivienda.getUbicacion().equals(ubicacion)& vivienda.getNumero()== numero){
				throw new RuntimeException("Esta Vivienda ya se encuentra registrada");
			}
		}
	}
	
	public void registrarAreaComun(String codigo, String tipo, String ubicacion, int capacidad, String estado){
		buscarAreaComun(codigo);
		AreaComun areaComun = new AreaComun(codigo, tipo, ubicacion, capacidad, estado);
		areasComunes.add(areaComun);
	}
	
	private void buscarAreaComun(String codigo){
		for (AreaComun areaComun : areasComunes){
			if (areaComun.getCodigo().equals(codigo)){
				throw new RuntimeException("Este codigo ya fue ingrasado");
			}
		}
			
	}
	
	private AreaComun buscarAreasComun(String codigo){
		for (AreaComun areaComun : areasComunes){
			if (areaComun.getCodigo().equals(codigo)){
				return areaComun;
			}
		}
		return null;
	}
	
	public void eliminarAreaComun(String codigo){
		areasComunes.remove(buscarAreasComun(codigo));
	}

	public void registrarCuota(String codigoCuota, String codigoVivienda, int mesPeriodo, int annoPeriodo, double valorCuota) {
		buscarViviendaConCuota(codigoVivienda, mesPeriodo, annoPeriodo);
		Cuota cuota = new Cuota(codigoCuota, codigoVivienda, mesPeriodo, annoPeriodo, valorCuota);
		cuotas.add(cuota);	
	}
	
	private void buscarViviendaConCuota(String codigoVivienda, int mesPeriodo, int annoPeriodo){
		for (Cuota cuota : cuotas){
			if (cuota.getCodigoVivienda().equals(codigoVivienda) & cuota.getMesPeriodo() == mesPeriodo & cuota.getAnnoPeriodo() == annoPeriodo){
				throw new RuntimeException("Esta Vivienda ya tiene registrada una cuota para este periodo");
			}
		}
	}

	public void registrarPagoDeCuota(String codigoCuota, int mesVenceCuota, int annoVenceCuota, String estado, String tipoDePago) {
		buscarCuota(codigoCuota);
		PagoCuota pagoNuevo = new PagoCuota(codigoCuota, mesVenceCuota, annoVenceCuota, estado, tipoDePago);
		pagoCuotas.add(pagoNuevo);
		
	}

	private void buscarCuota(String codigoCuota) {
		for (PagoCuota pagoCuota : pagoCuotas){
			if (pagoCuota.getCodigoCuota().equals(codigoCuota) & pagoCuota.getEstado().equals("Cancelado")){
				throw new RuntimeException("Esta Cuota ya esta cancelada");
			}
		}	
	}
	
	public void cargarMorosos (String periodo, double valorCuota, String fechaVencimiento, String ubicacion, int numero, String tipo, String dni, String nombre, String apellidoPaterno, String apellidoMaterno){
		for (PagoCuota pagoCuota : pagoCuotas){
			if (pagoCuota.getEstado().equals("Vencida")){
				
			}
		}
	}
	
	public ArrayList<Vencida> cuotasVencidas(){
		vencidas.removeAll(getVencidas());
		Date fecha = new Date();
		int aviso = 0;
		for(Cuota cuota : cuotas){
			if(cuota.getAnnoPeriodo() <= fecha.getYear() + 1900){
				if(cuota.getMesPeriodo() <= fecha.getMonth()){
					aviso = 0;
					if (pagoCuotas.size() != 0){
						for(PagoCuota pagoCuota : pagoCuotas){
							if(pagoCuota.getCodigoCuota().equals(cuota.getCodigoCuota())){
								aviso = 1;
							}	
						}
					}
					if (aviso == 0){
						Vencida vencida = new Vencida(cuota.getCodigoCuota(), cuota.getCodigoVivienda(), cuota.getMesPeriodo(), cuota.getAnnoPeriodo(), cuota.getValorCuota());
						vencidas.add(vencida);
					}
				}	
			}
		}
		return vencidas;
	}
	
}
